#region Copyright
//       Copyright (c) 2009 - Antoine Jaussoin - http://www.jaussoin.com/blog/
// 
//        This program is free software: you can redistribute it and/or modify
//        it under the terms of the GNU General Public License as published by
//        the Free Software Foundation, either version 3 of the License, or
//        (at your option) any later version.
// 
//        This program is distributed in the hope that it will be useful,
//        but WITHOUT ANY WARRANTY; without even the implied warranty of
//        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//        GNU General Public License for more details.
// 
//        You should have received a copy of the GNU General Public License
//        along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion
using System;
using System.Collections.Generic;
using FT.Architecture.Entities;
using FT.Architecture.Example.Core.Entities.Cars;
using FT.Architecture.Example.Core.Entities.Pets;
using FT.Architecture.Example.Core.Entities.Subscriptions;

namespace FT.Architecture.Example.Core.Entities.Humans
{
    /// <summary>
    /// Interface for all human entities
    /// </summary>
    public interface IHuman : ICanSpeak
    {
        /// <summary>
        /// Name
        /// </summary>
        [DomainSignature]
        string Name { get; set; }

        /// <summary>
        /// Date Born
        /// </summary>
        [DomainSignature]
        DateTime DateBorn { get; set; }

        /// <summary>
        /// Phone number
        /// </summary>
        [DomainSignature]
        string Telephone { get; set; }

        /// <summary>
        /// CV as a very long text
        /// </summary>
        string CV { get; set; }

        /// <summary>
        /// Age (calculated from the <see cref="DateBorn"/>, not stored, not mapped)
        /// </summary>
        int Age { get; }

        /// <summary>
        /// <see cref="IHuman"/> to whom this <see cref="IHuman"/> is married to
        /// </summary>
        IHuman MarriedTo { get; }

        /// <summary>
        /// Mary
        /// </summary>
        /// <param name="human"></param>
        void Mary(IHuman human);

        /// <summary>
        /// List of children
        /// </summary>
        ICollection<IHuman> Children { get; }

        /// <summary>
        /// List of pets
        /// </summary>
        ICollection<IPet> Pets { get; }

        /// <summary>
        /// List of borrowed pets
        /// </summary>
        ICollection<IPet> BorrowedPets { get; }

        /// <summary>
        /// Subscriptions
        /// </summary>
        ICollection<Subscription> Subscriptions { get; }

        /// <summary>
        /// Cars
        /// </summary>
        ICollection<ICar> Cars { get; }

        /// <summary>
        /// Father
        /// </summary>
        Man Father { get; }
        
        /// <summary>
        /// Mother of the person
        /// </summary>
        Woman Mother { get; }

        /// <summary>
        /// Produce a child
        /// </summary>
        /// <returns></returns>
        IHuman ProduceChild(string name, DateTime dateOfBirth, string telephoneNumber);

        /// <summary>
        /// Buy a random pet
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        IPet BuyAPet(string name);
    }
}